技巧19 “保存游戏”的方式:在2048里获胜

本技巧旨在提供一点儿轻松的调味剂,展示Docker可以怎样用来轻松地恢复状态。如果你对2048不是很熟悉,不妨把它看作是一个容易上瘾的在板上推数字的游戏。

问题

为了能够在需要的时候恢复到一个已知的状态,想要定期保存容器的状态。

解决方案

当不确定是否可以活下来时使用 docker commit 来“保存游戏”。

我们在此之前已经创建了一个单体镜像,用户可以在一个拥有VNC服务器以及Firefox的Docker容器里玩2048。

要使用这个镜像,用户需要安装一个VNC客户端。热门的实现方案有TigerVNC和VNC Viewer等。如果一个都没有,那么在宿主机上的包管理器里快速搜索关键字“vnc client”应该也能得到有用的结果。

要启动容器,可以执行代码清单3-24中列出的命令。

代码清单3-24 启动2048容器

$ docker run -d -p 5901:5901 -p 6080:6080 --name win2048 imiell/win2048  ⇽--- 将imiell/win2048镜像作为守护进程来运行
$ vncviewer localhost:1  ⇽--- 使用VNC获取对容器的GUI访问

先从 imiell/win2048 镜像运行一个容器,这一步我们已经准备好了。我们在后台启动这个容器,然后指定它应该给宿主机开放两个端口(5901和6080)。在容器内部自动启动的VNC服务器将会使用这些端口,还给容器起了一个以后易于使用的名字—— win2048

现在可以运行VNC Viewer了(根据安装的情况可执行文件可能会不同),然后指示它连接到本地计算机。因为相应的端口已经从容器里公开出来,连接到本地主机实际上也就是连接到容器。如果宿主机上除了一个标准的桌面外没有X显示,那么 localhost 后面的 :1 便是合理的——要是有,用户可能就得选择一个不同的数字,然后查阅下VNC Viewer的文档,将VNC端口手动指定为 5901

一旦连上了VNC服务器,它就会提示输入密码。这个镜像的VNC密码是 vncpass 。我们会看到一个带有Firefox标签页的窗口和一个预先加载的2048的表格。点击它以获取焦点,然后玩到准备好保存游戏为止。

要保存游戏,需要在提交它之后给这个命名好的容器打上一个标签,如代码清单3-25所示。

代码清单3-25 提交游戏状态并打上标签

$ docker commit win2048  ⇽--- 提交win2048容器
 4ba15c8d337a0a4648884c691919b29891cbbe26cb709c0fde74db832a942083  ⇽--- 引用你的提交的标签
$ docker tag 4ba15c8d337 my2048tag:$(date +%s)   ⇽--- 以整数形式表示的当前时间为这一提交打标签

在提交 win2048 容器后可以生成一个镜像ID,现在想给它赋予一个唯一的名字(因为可能会创建一堆这样的镜像)。为了做到这一点,我们将利用 date +%s 命令的输出作为镜像名称的一部分,该命令会输出一串从1970年的第一天开始算起的总秒数,提供一个唯一的(我们的目的)、不断增长的值。 $(command) 语法只是在该位置将内容替换为整个命令的输出。如果愿意,也可以手动执行 date +%s ,粘贴输出作为镜像名称的一部分。

然后可以继续玩下去,直到输了为止。现在该表演魔术了!我们可以通过代码清单3-26所示的命令返回到存档点。

代码清单3-26 返回到之前的游戏存档

$ docker rm -f win2048
$ docker run -d -p 5901:5901 -p 6080:6080 --name win2048 my2048tag:$mytag

$mytag 是在 docker images 命令里选出的一个标签。重复打标签、删除和运行这几个步骤,直到完成2048为止。

讨论

我们希望这是有趣的。这个例子的趣味性胜过实战性,但是我们已经使用过而且也看到其他一些开发者在使用这项技巧,效果很不错,尤其是当环境很复杂而他们正在做的事情不那么容易取证并且比较棘手的时候。

results matching ""

    No results matching ""